# 字典
# 可变 (键唯一不可变,值随意)
# 1.创建字典
# 语法：{键1:值1,键2:值2,...,键N:值N} 或 dic({})
# 字典的值可以是任意类型,键为不可变类型(元组,str,int..);字典元素有序(3.6以上版本),键/值必须唯一。
d1 = {}  # 空字典
print(d1, type(d1))  # {} <class 'dict'>
d2 = {"name": "张三", "age": 18}
print(d2)  # {'name': '张三', 'age': 18}
d3 = dict()  # 空字典
d4 = dict({"name": "李四", "age": 18})
print(d3, d4)  # {} {'name': '李四', 'age': 18}

# 2.字典的访问
# ①字典的值利用键访问
# 语法:字典变量[键]
d1 = {"name": "张三", "age": 18, 0: "哈哈"}
print(d1["name"])  # 张三
print(d1[0])  # 哈哈
# ②get()方法
# 语法:dict.get(key[,default]) 若指定的键不存在则返回默认值(default)
print(d1.get("age"))  # 18
print(d1.get("age11", "没有该键"))  # 没有该键
# ③内置方法:keys()键,values()值,items()键值对  返回一个列表
d1 = {"name": "张三", "age": 18, 'speak': "哈哈"}
print(d1.keys())  # dict_keys(['name', 'age', 'speak'])
print(d1.values())  # dict_values(['张三', 18, '哈哈'])
print(d1.items())  # dict_items([('name', '张三'), ('age', 18), ('speak', '哈哈')])
# 对keys(),values(),items()进行遍历
for i in d1.keys():
    print(i, end=" ")  # name age speak
print()
for i in d1.values():
    print(i, end=" ")  # 张三 18 哈哈
print()
for i in d1.items():  # 遍历返回一个(key,value)形式的元组
    print(i, end=" ")  # ('name', '张三') ('age', 18) ('speak', '哈哈')
print()

# 3.字典元素的添加和修改
# ①字典元素的添加
# 语法:字典变量[键] = 值
d1 = {"name": "张三", "age": 18, 'speak': "哈哈"}
d1["weight"] = 60
print(d1)  # {'name': '张三', 'age': 18, 'speak': '哈哈', 'weight': 60}
# 使用update()方法添加元素
d1.update(sno=90192)
print(d1)  # {'name': '张三', 'age': 18, 'speak': '哈哈', 'weight': 60, 'sno': 90192}
# ②字典元素的修改
# 与添加元素类似,通过键获取值,再对元素重新赋值
d1["age"] = 20  # 通过指定键修改值
print(d1)
d1.update(speak='你好')
print(d1)

# 4.字典元素的删除
# ①pop()方法
# 语法:dict.pop(key[,default]) 删除指定键的元素,键存在返回删除的键对应的值,键不存在时返回default
print(d1.pop("age"))  # 删除指定键为age的元素 返回被删除键的值 20
print(d1)
print(d1.pop("age", "该键不存在"))  # 删除不存在的键,返回默认值 该键不存在
# ②popitem()方法
# python3.6+ 删除并以(key,value)形式返回最后一个元素
d1 = {"name": "王大头", "age": 18, "weight": 50}
print(d1.popitem())  # ('weight', 50)
# ③clear()方法
# 清空字典中的元素
d1.clear()
print(d1)  # {}
# ④del语句
d1 = {"name": "王大头", "age": 18, "weight": 50}
del d1["name"]  # 删除指定的键
print(d1)  # {'age': 18, 'weight': 50}
del d1  # 删除整个字典

# 5.字典推导式
# 语法:{new_key : new_value for key,value in dict.items()}
# 用字典推导式交换key和value的值
d1 = {"name": "王大头", "age": 18, "weight": 50}
d1 = {value: key for key, value in d1.items()}
print(d1)  # {'王大头': 'name', 18: 'age', 50: 'weight'}
